package com.qf.scms.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qf.scms.entity.SelCourse;
import com.qf.scms.param.SelCourseParam;
import com.qf.scms.service.SelCourseService;
import com.qf.scms.utils.R;
import com.qf.scms.utils.TokenUtils;
import com.qf.scms.vo.CourseVO;
import com.qf.scms.vo.SelCourseCalculateVO;
import com.qf.scms.vo.SelCourseVO;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * (SelCourse)表控制层
 *
 * @author makejava
 * @since 2025-06-28 09:44:51
 */
@RestController
@RequestMapping("/currentSelCourse")
public class SelCourseController {
    /**
     * 服务对象
     */
    @Resource
    private SelCourseService selCourseService;

    /**
     * 选课分页查询
     * @param selCourseParam
     * @return
     */
    @GetMapping("/page")
    public R queryByPage(SelCourseParam selCourseParam) {
        Page<SelCourseVO> list = this.selCourseService.queryByPage(selCourseParam);
        return R.ok(list);
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public ResponseEntity<SelCourse> queryById(@PathVariable("id") Integer id) {
        return ResponseEntity.ok(this.selCourseService.queryById(id));
    }

    /**
     * 新增数据
     *
     * @param selCourse 实体
     * @return 新增结果
     */
    @PostMapping
    public ResponseEntity<SelCourse> add(SelCourse selCourse) {
        return ResponseEntity.ok(this.selCourseService.insert(selCourse));
    }

    /**
     * 编辑数据
     *
     * @param selCourse 实体
     * @return 编辑结果
     */
    @PutMapping
    public ResponseEntity<SelCourse> edit(SelCourse selCourse) {
        return ResponseEntity.ok(this.selCourseService.update(selCourse));
    }

    /**
     * 删除数据
     *
     * @param id 主键
     * @return 删除是否成功
     */
    @DeleteMapping
    public ResponseEntity<Boolean> deleteById(Integer id) {
        return ResponseEntity.ok(this.selCourseService.deleteById(id));
    }

    /**
     * 根据学生的id和课程id，删除选课记录信息
     * @param sid 学生id
     * @param cid 课程id
     * @return 是否删除成功，返回R对象
     */
    @GetMapping("/deleteSelCourseRecordBySid")
    public R deleteSelCourseRecordBySid(String sid, String cid) {
        Boolean result = selCourseService.deleteSelCourseRecordBySid(sid, cid);
        if (!result) {
        	return R.fail("删除失败");
        }
    	return R.ok("删除成功");
    }

    /**
     * 获取选课信息统计，即计算出该课程有多少人选和该课程的教室容量是多少
     * @param cid 课程id
     * @return 选课信息统计结果
     */
    @GetMapping("/selCourseCalculate")
    public R selCourseCalculate(String cid) {
        SelCourseCalculateVO selCourseCalculate = selCourseService.selCourseCalculate(cid);
        return R.ok(selCourseCalculate);
    }

    /**
     * 学生选课
     * @param selCourseParam 选课参数
     * @return 选课结果
     */
    @PostMapping("/studentSelectCourse")
    public R studentSelectCourse(@RequestBody SelCourseParam selCourseParam) {
        Boolean result = selCourseService.studentSelectCourse(selCourseParam);
        if (result) {
            return R.ok("选课成功");
        }
        return R.fail("选课失败");
    }

    /**
     * 查询当前学生的选课记录，最多选择五门课程哦
     * @param selCourseParam 选课参数
     * @return 选课记录
     */
    @GetMapping("/queryCurrentStuSelCourseByPage")
    public R queryCurrentStuSelCourseByPage(SelCourseParam selCourseParam) {
        IPage<CourseVO> page = selCourseService.queryStuSelCourseByPage(selCourseParam);
        return R.ok(page);
    }

    /**
     * 退选或者是删除当前学生的某条选课记录
     * @param cid 待删除的课程id
     * @return 是否删除成功
     */
    @GetMapping("/stuDeleteSelCourse")
    public R stuDeleteSelCourse(String cid) {
        String sid = String.valueOf(TokenUtils.getUidFromToken());
        Boolean result = selCourseService.deleteSelCourseRecordBySid(sid, cid);
        if (result) {
            return R.ok("退选成功");
        }
        return R.fail("退选失败");
    }
}

